'use strict'
const checkPermissions = require('../middlewares/check_permissions')

// 运行
module.exports = function (action, options) {
  options = options || {}

  return async function (ctx, next) {
    // 不知道原先这里return new Promise的含义在哪儿，koa框架里加上的话就不会正常返回

      // 错误处理函数
      /* err = {
      *   statusCode: 状态码
      *   code: 错误码
      *   msg: 错误信息
      * }
      */
      const errorHandle = function (err) {
        console.log('error Exception>>>', err)
        ctx.statusCode = err.statusCode || 200
        ctx.body = {
          code: err.code,
          msg: err.msg || '未知错误'
        }
      }

      // 不需要返回JSON
      if (options.raw) {
        try {
          await action(ctx, ctx)
        } catch (err) {
          errorHandle(err)
        }
        return
      }

      // 执行
      try {
        // 检查权限
        if (options && options.permissions) {
          if (!(checkPermissions.checkPermissions(ctx, options.permissions))) {
            const err = {
              statusCode: 401,
              code: -1,
              msg: 'Do not have privilege to access this api.'
            }
            throw err
          }
        }

        // 获取参数
        // let params = Object.assign({}, req.query, req.body, req.params)
        console.log('参数:', JSON.stringify(ctx.request))
        // 执行
        const data = await action(ctx, ctx.request, next)

        // 返回
        // ctx.body = {
        //   code: 0,
        //   data: data
        // }
        ctx.body = 'qwe'
        // 记录时间
      } catch (err) {
        errorHandle(err)
      }
  }
}
